<?php 
//header('Content-Type: text/html; charset=utf-8');
// Подключаем код NuSOAP 
require_once('lib/nusoap.php'); 
// Создаем экземпляр сервера 
$server = new soap_server(); 

$server->soap_defencoding = 'UTF-8';
$server->decode_utf8 = false;
// Инициализируем поддержку WSDL 
$server->configureWSDL('servise_server', 'urn:servise_server'); 
// Устанавливаем пространство имен с префиксом tns для WSDL-схемы 
$server->wsdl->schemaTargetNamespace = 'urn:servise_server'; 
// Регистрируем предоставляемый метод 
$server->register('parse',                // название метода 
    array('strg' => 'xsd:base64Binary'
		  //'strg' => 'xsd:string',
		  /*'param' => 'xsd:string'*/),        // входные параметры 
    array('return' => 'xsd:string'),      // выходные параметры 
    'urn:servise_server',            // пространство имен 
    'urn:servise_server#parse',      // soapaction 
    'rpc',                                // стиль 
    'encoded',                            // использование 
    'Parsing input xml-string'            // описание 
);


$server->register('listingDate',                // название метода 
    array('table_name' => 'xsd:string'),        							// входные параметры 
    array('return' => 'xsd:string'),      		// выходные параметры 
    'urn:servise_server',            			// пространство имен 
    'urn:servise_server#listingDate',      		// soapaction 
    'rpc',                                		// стиль 
    'encoded',                            		// использование 
    'List DB records'		            		// описание 
);

	
// Определяем метод как функцию PHP 
function parse($strg) { 
       
$InsertetIds = array();
 
$xmlstr = $strg;

// Проверка на пустые данные
if (empty($xmlstr)){
			return "Error: Your XML-file is empty\n";
			exit();
}
//--

try {
 
	//**********---------------------------------------------------------------------
	//===========================================================================================================
	/*
	function p_ar($ar){
		echo '<pre>';
		print_r($ar);
		echo '</pre>';
	}
	*/
	
	// Подключаем базу данных
	require_once("godb.php");

	$config = array(
		'host'      => 'localhost',
		'username'  => 'u_cytellec',
		'passwd'    => 'QsQeaM44',
		'dbname'    => 'cytellec',
		'charset'   => 'utf8',
		'debugtime' => false,
		'debug'     => false
	);

	goDB::makeDB($config);

	$parseMsg = "";
	//============================
	
	/*
	$xmlstr = <<<XML
	<?xml version='1.0' encoding="UTF-8" standalone='yes'?>
	<dbparams tablename = "s0x_data_indexes_value">
		<param>
			<date type = "measurement">15.11.2011</date>
			<rate type = "measurement">СуммаПродаж</rate>
			<sum type = "resource">300000</sum>
		</param>
		<param>
			<date type = "measurement">15.11.2011</date>
			<rate type = "measurement">СуммаПродаж</rate>
			<sum type = "resource">300000</sum>
		</param>
	</dbparams>
	
XML;
	*/
	//============================
		//--
		//if($connection = @mysql_connect($db_host, $db_user, $db_pass)){
			//echo "<b>Connected successfully (Соединение установлено)</b>\n<br>";
			//$parseMsg = "Connected successfully (Соединение установлено)\n";
			//if(mysql_select_db($db_name, $connection)){
			//*****************************************
				//echo "<b>Selected successfully (База успешно выбрана)</b>\n<br>";
				//$parseMsg = "Selected successfully (База успешно выбрана)\n";
				//mysql_set_charset('utf8',$connection);										//Кодировка данных в БД utf-8
				
				
				///////////////////////////////////////////////////////////////////
				// ПОЛУЧАЕМ СПИСОК ТАБЛИЦ БАЗЫ ДАННЫХ
				
				$query ="SHOW TABLES";
				$tables = goDB::queryDB($query,null,'row'); 
				
				//-----------------------------------------------------------------------			
				if (($sXML = @simplexml_load_string($xmlstr))===false){
					//echo "<b>Ошибка получения XML. Ваши данные повреждены. Проверте структуру XML-файла.</b>\n<br>";
					$parseMsg = "error 102! Ошибка получения XML. Ваши данные повреждены. Проверте структуру XML-файла.\n";
					return $parseMsg;
					exit();
				}else{
					//echo "<b>XML уcпешно получен.</b>\n<br>";
					$parseMsg = "XML уcпешно получен.\n";
					//p_ar($sXML);
					
					if (count($sXML->param)<=0){
						$parseMsg = "error 103! Нет ни одной строки для загрузки.\n";
						return $parseMsg;
					}
					
					if (count($sXML->param)>100000){
						$parseMsg = "error 104! Запрещено правами добавлять строк > 100000.\n";
						return $parseMsg;
					}
					
					///////////////////////////////////////////////////////////////////
					// ПРОВЕРЯЕМ ИМЯ ТАБЛИЦЫ
				
					$arr = $sXML->attributes();   // returns an array
					if(empty($arr["tablename"])){
						$parseMsg = "error 105! Не указано имя таблицы базы данных.\n";
						return $parseMsg;
						exit();
					}
					if((substr((string)$arr["tablename"],0,10) != 'default_IS')and(substr((string)$arr["tablename"],0,19) != 'default_InfoStreams')){
						$parseMsg = "error 106! Нет разрешения редактировать эту таблицу.\n";
						return $parseMsg;
						exit();
					}
					
					$table_name = '';
					foreach ($tables as $table){
						if((string)$arr["tablename"] == $table[0]){
							$table_name = $table[0];
						}
					}
					if($table_name == ''){
						$parseMsg = 'error 107! Указанная таблица "'.(string)$arr["tablename"].'" в базе данных не найдена.\n';
						return $parseMsg;
						exit();  
					}
							
					///////////////////////////////////////////////////////////////////
					// ПРОВЕРЯЕМ ИМЯ КОЛОНОК
					
					// Получаем список всех полей таблицы. нужно для проверки входных данных
					$query = "SHOW COLUMNS FROM ".$table_name;		
					$field_names = goDB::queryDB($query,null,'col'); 

					//$field_names - содержит названия всех полей таблицы `info`
					//echo "-------field_names--------<br/>";
					//p_ar($field_names);
					//echo "-------field_names--------<br/>";
				
					$inserted_count = 0;
					$updated_count = 0;
					
					foreach ($sXML->param as $param) {
						//p_ar($param);
						//echo count($param)."<br />"; //Количество параметров у элемента xml-файла
						//--Блок просмотра атрибутов у элементов xml-файла
						$measurement = array();
						//foreach ($sXML->param->children() as $node) {
						foreach ($param->children() as $node) {
							$arr = $node->attributes();   // returns an array
							if((string)$arr["type"] == "measurement"){
								$measurement[$node->getname()] = (string)$node[0];			//Массив с элементами типа "Значение"
							}												
						}
						//================В данном месте можно делать всевозможные проверки на параметры элементов:==
						//Не может быть не существовать ни одного элемента типа "Значение"
						if (empty($measurement)){
							//echo "Неверный формат XML-файла. Нет значащих элементов.\n<br/>";
							$parseMsg = "error 109! Неверный формат XML-файла. Нет ни одного измерения.\n";
							return $parseMsg;
							exit();
						}
						// if(!array_key_exists('date', $measurement)){
							// //echo "Неверный формат XML-файла. Дата - обязательный параметр.\n<br/>";
							// $parseMsg = "Неверный формат XML-файла.  Не заполнен обязательный параметр - date.\n";
							// return $parseMsg;
							// exit();
						// }
						// if(!array_key_exists('s_idorg', $measurement)){
							// //echo "Неверный формат XML-файла. Показатель - обязательный параметр.\n<br/>";
							// $parseMsg = "Неверный формат XML-файла. Не заполнен обязательный параметр - s_idorg.\n";
							// return $parseMsg;
							// exit();
						// }
						// if(!array_key_exists('s_idind', $measurement)){
							// //echo "Неверный формат XML-файла. Показатель - обязательный параметр.\n<br/>";
							// $parseMsg = "Неверный формат XML-файла. Не заполнен обязательный параметр - s_idind.\n";
							// return $parseMsg; 
							// exit();
						// } 
						//================/В данном месте можно делать всевозможные проверки на параметры элементов==
						//print ("<hr />");
						//echo "<br/>-------measurement--------<br/>";
						//p_ar($measurement);					
						//echo "-------/measurement--------<br/>";
						//--					
						//echo "<hr width = '50%' align = 'left' />";
						//--
						//Дочерние элементы элемента <param> должны быть такими как в поля в БД
						//Проверка на посторонние данные
						$vars = get_object_vars($param);									//Массив с именами доч.элем. тега <param>
						//echo "---------object_vars-------<br>";
						//p_ar($vars);
						//echo "---------/object_vars-------<br>";
						//---------------Работа с БД:
						while (list($key, $value) = each($vars)) :
							//Если подсунули левый параметр то скрипт выдает ошибку и завершается
							if (!in_array($key, $field_names)){
								//echo "<b>Error: Wrong XML, this value = $key not exist in array-list-base<br />\n</b>";
								$parseMsg = "error 110! Wrong XML, колонка = $key не найдена в таблице $table_name\n"; 
								return $parseMsg;
								exit();
							}				
						endwhile;
						
						//------------------------------------------------ОСНОВНЫЕ ЗАПРОСЫ НА ДОБАВЛЕНИЕ+ОБНОВЛЕНИЕ БД----------------------
						$strQuery = "SELECT COUNT(*) FROM `$table_name` WHERE ";
						foreach ((array)$measurement as $mkey => $mval){
							$strQuery .= "`$mkey` = \"$mval\" and ";
						}
						$queryLenght = strrpos ($strQuery , "and")-1; //Т.к. Еще нужно пробел в конце удалить
						$strQueryEx = substr ( $strQuery , 0,  $queryLenght);
												
						//echo "<br /><h2>ЗАПРОС к БД: ".$strQueryEx."</h2>";
						$resultEx = goDB::queryDB($strQueryEx,null,'el'); 
						
						if ($resultEx <= 0) {
							//INSERT
							//echo "next -- > INSERT Query<br/>";
							
							$insQuery = 'INSERT INTO `'.$table_name.'` (`' . implode('`, `',array_keys($vars)).'`) VALUES("'.(implode('", "', array_values($vars))).'")';
							
							$insResult = goDB::queryDB($insQuery,null,'id');
							//echo "<br /><h2>ЗАПРОС к БД: ".$insResult."</h2>";
							
                            $InsertetIds[] = $insResult;
                            
							$inserted_count++;
						}
						else{
							//UPDATE
							//echo "next -- > UPDATE Query<br/>";
							
							$upQueryP1 = "UPDATE `$table_name` SET ";
							//===
							$upQueryP2 = "";
							foreach ((array)$vars as $vkey => $vval){
								$upQueryP2 .= "`$vkey` = \"$vval\", ";
							}
							$upQueryLenght = strrpos ($upQueryP2 , ","); //Т.к. Еще нужно пробел в конце удалить
							$upQueryP2 = substr ( $upQueryP2 , 0,  $upQueryLenght);
							//===
							$upQueryP3 = " WHERE ";
							foreach ((array)$measurement as $mkey => $mval){
								$upQueryP3 .= "`$mkey` = \"$mval\" and ";
							}
							$upQueryLenght = strrpos ($upQueryP3 , "and")-1; //Т.к. Еще нужно пробел в конце удалить
							$upQueryP3 = substr ( $upQueryP3 , 0,  $upQueryLenght);
							$upQuery = $upQueryP1.$upQueryP2.$upQueryP3;
							
							$uptResult = goDB::queryDB($upQuery,null);
							
							$updated_count++;
							
							//echo "<br /><h2>ЗАПРОС к БД: ".$upQuery."</h2>";
						}
						//------------------------------------------------/ОСНОВНЫЕ ЗАПРОСЫ НА ДОБАВЛЕНИЕ+ОБНОВЛЕНИЕ БД----------------------
					} //end foreach
					//echo "<hr /><hr />";
					//echo "<b>The end, - Your data is written to the database (Данные успешно внесены в БД)\n</b>";
					$parseMsg = "The end, - Your data is written to the database (Данные успешно внесены в БД): Inserted count (добавлено строк): ".$inserted_count."; Updated count (обновлено строк):".$updated_count.";";			
				}
			//*****************************************			
			//}
			//else{
			//	//echo "<b>Could not select db \'$name:\' " . mysql_error()."</b>\n<br/>";
			//	$parseMsg = "error 301! Could not select db \'$name:\' " . mysql_error()."\n";
			//	mysql_close($connection);
			//	return $parseMsg;
			//	exit();
			//} 
		//}
		//else{
		//	//echo "<b>Could not connect: " . mysql_error()."</b>\n<br/>";
		//	$parseMsg = "error 302! Could not connect: " . mysql_error()."\n";
		//	return $parseMsg;
		//	exit(); 
		//}
	//============================
    return implode(",", $InsertetIds);
	//return $parseMsg;
	//===========================================================================================================
	//**********---------------------------------------------------------------------
 
 } 	catch (Exception $e) { 
		// Сообщение об ощибке
		$error_description = "Exception ".$e->getCode().": ".$e->getMessage()."<br />".
								" in ".$e->getFile().", Ln ".$e->getLine()."<br />";
		return $error_description;
		exit();
 }
 
	
} //endfunction 

function listingDate($table_name){

	$db_name = 'cytellec';
	$db_user = 'u_cytellec';
	$db_pass = 'QsQeaM44';
	$db_host = 'localhost';
	
	if($connection = @mysql_connect($db_host, $db_user, $db_pass)){
		$retMsg = "Connected successfully (Соединение установлено)\n";
		if(mysql_select_db($db_name, $connection)){
			//*****************************************
			$retMsg = "Selected successfully (База успешно выбрана)\n";
			mysql_set_charset('utf8',$connection);										//Кодировка данных в БД utf-8
			// Получаем список всех полей таблицы. нужно для проверки входных данных
			$query = "SHOW COLUMNS FROM $table_name";		
			$result = mysql_query($query);
			if (!$result) {
				$retMsg = 'Could not run query: ' . mysql_error();
				return $retMsg;
				exit();
			}
			if (mysql_num_rows($result) > 0) {
				while ($row = mysql_fetch_assoc($result)) {
					$field_names[]  =  $row['Field'];									//$field_names - список всех полей таблицы
				}
			}
			$paramCount = count($field_names);

			//=========================================
			$listQuery = "SELECT * FROM `$table_name`";
			$listResult = mysql_query($listQuery);
			if(!$listResult){
				$retMsg = "Could not select query-method " . mysql_error()."\n";
				return $retMsg;
				exit();
			}
			if(mysql_num_rows($listResult)<=0){
				$retMsg = "DB is empty (База данных пуста)\n";
				return $retMsg;
				exit();
			}
			else{
				$retMsg = "";
				while($row = mysql_fetch_array($listResult)){
					for ($i=0; $i < $paramCount; $i++){
						$retMsg .= "--== $row[$i] ==--";
					}
					$retMsg .= "\n<br />";
				}
			}
			//=========================================
		}
		else{
			//echo "<b>Could not select db \'$name:\' " . mysql_error()."</b>\n<br/>";
			$retMsg = "Could not select db \'$name:\' " . mysql_error()."\n";
			mysql_close($connection);
			return $retMsg;
			exit();
		}
	}
	else{
		//echo "<b>Could not connect: " . mysql_error()."</b>\n<br/>";
		$retMsg = "Could not connect: " . mysql_error()."\n";
		return $retMsg;
		exit();
	}
	
	return $retMsg;
}

// Используем HTTP-запрос чтобы вызвать сервис 
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ''; 
$server->service($HTTP_RAW_POST_DATA); 
?>